/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modeles.beans;

import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import modeles.*;
import modeles.servicesClient.*;
import org.primefaces.event.FileUploadEvent;
import utilitaires.ftp.FTPTransfer;

/**
 *
 * @author Fred
 */
@ManagedBean
@ViewScoped
public abstract class FormulaireProduit implements Serializable {

    private final ServicesProduits servicesProduits;
    private final ServicesRayons servicesRayons;
    private final ServicesCategories servicesCategories;
    private List<Rayon> rayons;
    private List<CategorieProduit> categories;
    private int idRayonSelectionne;
    private int idCategorieSelectionnee;

    /**
     * Creates a new instance of ProduitBean
     */
    public FormulaireProduit() {
        this.servicesProduits = new ServicesProduits();
        this.servicesRayons = new ServicesRayons();
        this.servicesCategories = new ServicesCategories();
        this.idRayonSelectionne = -1;
        this.idCategorieSelectionnee = -1;
    }

    protected abstract Produit getProduit();

    protected ServicesProduits getServicesProduits() {
        return servicesProduits;
    }

    protected ServicesRayons getServicesRayons() {
        return servicesRayons;
    }

    protected ServicesCategories getServicesCategories() {
        return servicesCategories;
    }

    public List<Rayon> getRayons() {
        if (rayons == null) {
            rayons = servicesRayons.getRayons();
        }
        return rayons;
    }

    public List<CategorieProduit> getCategories() {
        if (categories == null) {
            categories = servicesCategories.getCategories();
        }
        return categories;
    }

    public Promotion getPromotion() {
        if (getProduit().getPromotion() == null) {
            getProduit().setPromotion(new Promotion());
        }
        return getProduit().getPromotion();
    }

    public int getIdRayonSelectionne() {
        return idRayonSelectionne;
    }

    public void setIdRayonSelectionne(int idRayonSelectionne) {
        this.idRayonSelectionne = idRayonSelectionne;
    }

    public int getIdCategorieSelectionnee() {
        return idCategorieSelectionnee;
    }

    public void setIdCategorieSelectionnee(int idCategorieSelectionnee) {
        this.idCategorieSelectionnee = idCategorieSelectionnee;
    }

    public CategorieProduit getCategorieSelectionnee() {
        return trouverCategorie(idCategorieSelectionnee);
    }

    public void ajouterCategorie() {
        if (idCategorieSelectionnee >= 0) {
            getProduit().getCategories().add(trouverCategorie(idCategorieSelectionnee));
        }
    }

    public void supprimerCategorie(CategorieProduit cat) {
        getProduit().getCategories().remove(cat);
    }

    protected CategorieProduit trouverCategorie(int id) {
        CategorieProduit resultat = null;
        for (CategorieProduit cat : categories) {
            if (cat.getId() == id) {
                resultat = cat;
            }
        }
        return resultat;
    }

    protected Rayon trouverRayon(int id) {
        Rayon resultat = null;
        for (Rayon r : rayons) {
            if (r.getId() == id) {
                resultat = r;
            }
        }
        return resultat;
    }

    protected void ajouterMessage(String msg, FacesMessage.Severity severity) {
        FacesMessage message = new FacesMessage(msg);
        if (severity != null) {
            message.setSeverity(severity);
        }
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    protected boolean checkPromotion() {
        boolean ok = true;
        if (!getPromotion().getType().isEmpty()) {
            if (getPromotion().getValeur() < 0.01f) {
                ajouterMessage("La valeur de la promotion doit être supérieur à 0.01.", FacesMessage.SEVERITY_ERROR);
                ok = false;
            }
            if (getPromotion().getQuantiteNecessaire() == 0) {
                ajouterMessage("La quantité pour la promotion doit être supérieur à 0.", FacesMessage.SEVERITY_ERROR);
                ok = false;
            }
        }
        return ok;
    }

    protected boolean checkCategorie() {
        if (getProduit().getCategories().size() <= 0) {
            ajouterMessage("Le produit doit appartenir à au moins une catégorie.", FacesMessage.SEVERITY_ERROR);
            return false;
        }
        return true;
    }

    public void uploadImage(FileUploadEvent event) {
        try {
            String fileName = event.getFile().getFileName();
            String extension = fileName.substring(fileName.lastIndexOf("."));
            String newFileName = System.currentTimeMillis() + extension;
            String hostFileFullName = "public_html/ShopEasy/img/" + newFileName;
            FTPTransfer.connect();
            FTPTransfer.uploadFile(event.getFile().getInputstream(), hostFileFullName);
            setUrlPhoto(newFileName);
            ajouterMessage("Le fichier a été uploader avec succès.", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            ajouterMessage(ex.getMessage(), null);
        } finally {
            FTPTransfer.disconnect();
        }
    }

    private void setUrlPhoto(String filename) {
        getProduit().setUrlPhoto("http://192.168.128.13/~b110073/ShopEasy/img/" + filename);
    }
}
